﻿// Copyright (c) Ryan Garrett.  All rights reserved.
// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY
// OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT
// LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
// FITNESS FOR A PARTICULAR PURPOSE.
//===================================================================================

using Caffeine.Core.Test.TestModel;
using System;
using System.Collections.Generic;

namespace Caffeine.Core.Test.TestModel
{
    public class ModelForEnvironmentHelperTestingA : ModelBase
    {
        #region DaysSinceLastVisit Property

        [ModelBackingProperty(typeof(Int32), "DaysSinceLastVisitProperty", ModelBase.StandardBehaviors, false, true)]
        protected readonly ModelProperty<Int32> _DaysSinceLastVisitProperty = null; //Will be set by reflection.

        /// <summary>
        /// Gets the DaysSinceLastVisit backing property
        /// </summary>
        public ModelProperty<Int32> DaysSinceLastVisitProperty
        {
            get { return _DaysSinceLastVisitProperty; }
        }

        /// <summary>
        /// Gets or sets the DaysSinceLastVisitProperty.Value value. This property supports change notification. If the DaysSinceLastVisitProperty.Value value changes,
        /// it will cause a change notification event for this property. This property must follow the [DaysSinceLastVisitProperty - "Property"] convention for change events to work correctly.
        /// </summary>
        public Int32 DaysSinceLastVisit
        {
            get { return DaysSinceLastVisitProperty.Value; }
            set { DaysSinceLastVisitProperty.Value = value; }
        }

        /// <summary>
        /// Gets the DaysSinceLastVisitProperty.CommittedValue value. This property supports change notification. If the DaysSinceLastVisitProperty.CommittedValue value changes,
        /// it will cause a change notification event for this property. This property must follow the [DaysSinceLastVisit + "CommittedValue"] convention for change events to work correctly.
        /// </summary>
        public Int32 DaysSinceLastVisitCommittedValue
        {
            get { return DaysSinceLastVisitProperty.CommittedValue; }
        }

        /// <summary>
        /// Gets the DaysSinceLastVisitProperty.IsDirty flag. This property supports change notification. If the DaysSinceLastVisitProperty.IsDirty flag changes,
        /// it will cause a change notification event for this property. This property must follow the [DaysSinceLastVisit + "IsDirty"] convention for change events to work correctly.
        /// </summary>
        public bool DaysSinceLastVisitIsDirty
        {
            get { return DaysSinceLastVisitProperty.IsDirty; }
        }

        /// <summary>
        /// Gets the DaysSinceLastVisitProperty.IsInvalid flag. This property supports change notification. If the DaysSinceLastVisitProperty.IsInvalid flag changes,
        /// it will cause a change notification event for this property. This property must follow the [DaysSinceLastVisit + "IsInvalid"] convention for change events to work correctly.
        /// </summary>
        public bool DaysSinceLastVisitIsInvalid
        {
            get { return DaysSinceLastVisitProperty.IsInvalid; }
        }

        /// <summary>
        /// Gets the DaysSinceLastVisitProperty.IsDefault flag. This property supports change notification. If the DaysSinceLastVisitProperty.IsDefault flag changes,
        /// it will cause a change notification event for this property. This property must follow the [DaysSinceLastVisit + "IsDefault"] convention for change events to work correctly.
        /// </summary>
        public bool DaysSinceLastVisitIsDefault
        {
            get { return DaysSinceLastVisitProperty.IsDefault; }
        }

        /// <summary>
        /// Gets the DaysSinceLastVisitProperty.ValidationErrors enumeration. This property supports change notification. If the DaysSinceLastVisitProperty.ValidationErrors enumeration changes,
        /// it will cause a change notification event for this property. This property must follow the [DaysSinceLastVisit + "ValidationErrors"] convention for change events to work correctly.
        /// </summary>
        public System.Collections.Generic.IEnumerable<ValidationError> DaysSinceLastVisitValidationErrors
        {
            get { return DaysSinceLastVisitProperty.ValidationErrors; }
        }

        #endregion

        #region DaysUntilNextVisit Property

        [ModelBackingProperty(typeof(Nullable<Int32>), "DaysUntilNextVisitProperty", ModelBase.StandardBehaviors, false, true)]
        protected readonly ModelProperty<Nullable<Int32>> _DaysUntilNextVisitProperty = null; //Will be set by reflection.

        /// <summary>
        /// Gets the DaysUntilNextVisit backing property
        /// </summary>
        public ModelProperty<Nullable<Int32>> DaysUntilNextVisitProperty
        {
            get { return _DaysUntilNextVisitProperty; }
        }

        /// <summary>
        /// Gets or sets the DaysUntilNextVisitProperty.Value value. This property supports change notification. If the DaysUntilNextVisitProperty.Value value changes,
        /// it will cause a change notification event for this property. This property must follow the [DaysUntilNextVisitProperty - "Property"] convention for change events to work correctly.
        /// </summary>
        public Nullable<Int32> DaysUntilNextVisit
        {
            get { return DaysUntilNextVisitProperty.Value; }
            set { DaysUntilNextVisitProperty.Value = value; }
        }

        /// <summary>
        /// Gets the DaysUntilNextVisitProperty.CommittedValue value. This property supports change notification. If the DaysUntilNextVisitProperty.CommittedValue value changes,
        /// it will cause a change notification event for this property. This property must follow the [DaysUntilNextVisit + "CommittedValue"] convention for change events to work correctly.
        /// </summary>
        public Nullable<Int32> DaysUntilNextVisitCommittedValue
        {
            get { return DaysUntilNextVisitProperty.CommittedValue; }
        }

        /// <summary>
        /// Gets the DaysUntilNextVisitProperty.IsDirty flag. This property supports change notification. If the DaysUntilNextVisitProperty.IsDirty flag changes,
        /// it will cause a change notification event for this property. This property must follow the [DaysUntilNextVisit + "IsDirty"] convention for change events to work correctly.
        /// </summary>
        public bool DaysUntilNextVisitIsDirty
        {
            get { return DaysUntilNextVisitProperty.IsDirty; }
        }

        /// <summary>
        /// Gets the DaysUntilNextVisitProperty.IsInvalid flag. This property supports change notification. If the DaysUntilNextVisitProperty.IsInvalid flag changes,
        /// it will cause a change notification event for this property. This property must follow the [DaysUntilNextVisit + "IsInvalid"] convention for change events to work correctly.
        /// </summary>
        public bool DaysUntilNextVisitIsInvalid
        {
            get { return DaysUntilNextVisitProperty.IsInvalid; }
        }

        /// <summary>
        /// Gets the DaysUntilNextVisitProperty.IsDefault flag. This property supports change notification. If the DaysUntilNextVisitProperty.IsDefault flag changes,
        /// it will cause a change notification event for this property. This property must follow the [DaysUntilNextVisit + "IsDefault"] convention for change events to work correctly.
        /// </summary>
        public bool DaysUntilNextVisitIsDefault
        {
            get { return DaysUntilNextVisitProperty.IsDefault; }
        }

        /// <summary>
        /// Gets the DaysUntilNextVisitProperty.ValidationErrors enumeration. This property supports change notification. If the DaysUntilNextVisitProperty.ValidationErrors enumeration changes,
        /// it will cause a change notification event for this property. This property must follow the [DaysUntilNextVisit + "ValidationErrors"] convention for change events to work correctly.
        /// </summary>
        public System.Collections.Generic.IEnumerable<ValidationError> DaysUntilNextVisitValidationErrors
        {
            get { return DaysUntilNextVisitProperty.ValidationErrors; }
        }

        #endregion

        #region DateOfBirth Property

        [ModelBackingProperty(typeof(Nullable<DateTime>), "DateOfBirthProperty", ModelBase.StandardBehaviors, false, true)]
        protected readonly ModelProperty<Nullable<DateTime>> _DateOfBirthProperty = null; //Will be set by reflection.

        /// <summary>
        /// Gets the DateOfBirth backing property
        /// </summary>
        public ModelProperty<Nullable<DateTime>> DateOfBirthProperty
        {
            get { return _DateOfBirthProperty; }
        }

        /// <summary>
        /// Gets or sets the DateOfBirthProperty.Value value. This property supports change notification. If the DateOfBirthProperty.Value value changes,
        /// it will cause a change notification event for this property. This property must follow the [DateOfBirthProperty - "Property"] convention for change events to work correctly.
        /// </summary>
        public Nullable<DateTime> DateOfBirth
        {
            get { return DateOfBirthProperty.Value; }
            set { DateOfBirthProperty.Value = value; }
        }

        /// <summary>
        /// Gets the DateOfBirthProperty.CommittedValue value. This property supports change notification. If the DateOfBirthProperty.CommittedValue value changes,
        /// it will cause a change notification event for this property. This property must follow the [DateOfBirth + "CommittedValue"] convention for change events to work correctly.
        /// </summary>
        public Nullable<DateTime> DateOfBirthCommittedValue
        {
            get { return DateOfBirthProperty.CommittedValue; }
        }

        /// <summary>
        /// Gets the DateOfBirthProperty.IsDirty flag. This property supports change notification. If the DateOfBirthProperty.IsDirty flag changes,
        /// it will cause a change notification event for this property. This property must follow the [DateOfBirth + "IsDirty"] convention for change events to work correctly.
        /// </summary>
        public bool DateOfBirthIsDirty
        {
            get { return DateOfBirthProperty.IsDirty; }
        }

        /// <summary>
        /// Gets the DateOfBirthProperty.IsInvalid flag. This property supports change notification. If the DateOfBirthProperty.IsInvalid flag changes,
        /// it will cause a change notification event for this property. This property must follow the [DateOfBirth + "IsInvalid"] convention for change events to work correctly.
        /// </summary>
        public bool DateOfBirthIsInvalid
        {
            get { return DateOfBirthProperty.IsInvalid; }
        }

        /// <summary>
        /// Gets the DateOfBirthProperty.IsDefault flag. This property supports change notification. If the DateOfBirthProperty.IsDefault flag changes,
        /// it will cause a change notification event for this property. This property must follow the [DateOfBirth + "IsDefault"] convention for change events to work correctly.
        /// </summary>
        public bool DateOfBirthIsDefault
        {
            get { return DateOfBirthProperty.IsDefault; }
        }

        /// <summary>
        /// Gets the DateOfBirthProperty.ValidationErrors enumeration. This property supports change notification. If the DateOfBirthProperty.ValidationErrors enumeration changes,
        /// it will cause a change notification event for this property. This property must follow the [DateOfBirth + "ValidationErrors"] convention for change events to work correctly.
        /// </summary>
        public System.Collections.Generic.IEnumerable<ValidationError> DateOfBirthValidationErrors
        {
            get { return DateOfBirthProperty.ValidationErrors; }
        }

        #endregion

        #region MyEnumProperty Property

        [ModelBackingProperty(typeof(EnumForTesting), "MyEnumPropertyProperty", ModelBase.StandardBehaviors, false, true)]
        protected readonly ModelProperty<EnumForTesting> _MyEnumPropertyProperty = null; //Will be set by reflection.

        /// <summary>
        /// Gets the MyEnumProperty backing property
        /// </summary>
        public ModelProperty<EnumForTesting> MyEnumPropertyProperty
        {
            get { return _MyEnumPropertyProperty; }
        }

        /// <summary>
        /// Gets or sets the MyEnumPropertyProperty.Value value. This property supports change notification. If the MyEnumPropertyProperty.Value value changes,
        /// it will cause a change notification event for this property. This property must follow the [MyEnumPropertyProperty - "Property"] convention for change events to work correctly.
        /// </summary>
        public EnumForTesting MyEnumProperty
        {
            get { return MyEnumPropertyProperty.Value; }
            set { MyEnumPropertyProperty.Value = value; }
        }

        /// <summary>
        /// Gets the MyEnumPropertyProperty.CommittedValue value. This property supports change notification. If the MyEnumPropertyProperty.CommittedValue value changes,
        /// it will cause a change notification event for this property. This property must follow the [MyEnumProperty + "CommittedValue"] convention for change events to work correctly.
        /// </summary>
        public EnumForTesting MyEnumPropertyCommittedValue
        {
            get { return MyEnumPropertyProperty.CommittedValue; }
        }

        /// <summary>
        /// Gets the MyEnumPropertyProperty.IsDirty flag. This property supports change notification. If the MyEnumPropertyProperty.IsDirty flag changes,
        /// it will cause a change notification event for this property. This property must follow the [MyEnumProperty + "IsDirty"] convention for change events to work correctly.
        /// </summary>
        public bool MyEnumPropertyIsDirty
        {
            get { return MyEnumPropertyProperty.IsDirty; }
        }

        /// <summary>
        /// Gets the MyEnumPropertyProperty.IsInvalid flag. This property supports change notification. If the MyEnumPropertyProperty.IsInvalid flag changes,
        /// it will cause a change notification event for this property. This property must follow the [MyEnumProperty + "IsInvalid"] convention for change events to work correctly.
        /// </summary>
        public bool MyEnumPropertyIsInvalid
        {
            get { return MyEnumPropertyProperty.IsInvalid; }
        }

        /// <summary>
        /// Gets the MyEnumPropertyProperty.IsDefault flag. This property supports change notification. If the MyEnumPropertyProperty.IsDefault flag changes,
        /// it will cause a change notification event for this property. This property must follow the [MyEnumProperty + "IsDefault"] convention for change events to work correctly.
        /// </summary>
        public bool MyEnumPropertyIsDefault
        {
            get { return MyEnumPropertyProperty.IsDefault; }
        }

        /// <summary>
        /// Gets the MyEnumPropertyProperty.ValidationErrors enumeration. This property supports change notification. If the MyEnumPropertyProperty.ValidationErrors enumeration changes,
        /// it will cause a change notification event for this property. This property must follow the [MyEnumProperty + "ValidationErrors"] convention for change events to work correctly.
        /// </summary>
        public System.Collections.Generic.IEnumerable<ValidationError> MyEnumPropertyValidationErrors
        {
            get { return MyEnumPropertyProperty.ValidationErrors; }
        }

        #endregion

        #region MyNullableEnumProperty Property

        [ModelBackingProperty(typeof(Nullable<EnumForTesting>), "MyNullableEnumPropertyProperty", ModelBase.StandardBehaviors, false, true)]
        protected readonly ModelProperty<Nullable<EnumForTesting>> _MyNullableEnumPropertyProperty = null; //Will be set by reflection.

        /// <summary>
        /// Gets the MyNullableEnumProperty backing property
        /// </summary>
        public ModelProperty<Nullable<EnumForTesting>> MyNullableEnumPropertyProperty
        {
            get { return _MyNullableEnumPropertyProperty; }
        }

        /// <summary>
        /// Gets or sets the MyNullableEnumPropertyProperty.Value value. This property supports change notification. If the MyNullableEnumPropertyProperty.Value value changes,
        /// it will cause a change notification event for this property. This property must follow the [MyNullableEnumPropertyProperty - "Property"] convention for change events to work correctly.
        /// </summary>
        public Nullable<EnumForTesting> MyNullableEnumProperty
        {
            get { return MyNullableEnumPropertyProperty.Value; }
            set { MyNullableEnumPropertyProperty.Value = value; }
        }

        /// <summary>
        /// Gets the MyNullableEnumPropertyProperty.CommittedValue value. This property supports change notification. If the MyNullableEnumPropertyProperty.CommittedValue value changes,
        /// it will cause a change notification event for this property. This property must follow the [MyNullableEnumProperty + "CommittedValue"] convention for change events to work correctly.
        /// </summary>
        public Nullable<EnumForTesting> MyNullableEnumPropertyCommittedValue
        {
            get { return MyNullableEnumPropertyProperty.CommittedValue; }
        }

        /// <summary>
        /// Gets the MyNullableEnumPropertyProperty.IsDirty flag. This property supports change notification. If the MyNullableEnumPropertyProperty.IsDirty flag changes,
        /// it will cause a change notification event for this property. This property must follow the [MyNullableEnumProperty + "IsDirty"] convention for change events to work correctly.
        /// </summary>
        public bool MyNullableEnumPropertyIsDirty
        {
            get { return MyNullableEnumPropertyProperty.IsDirty; }
        }

        /// <summary>
        /// Gets the MyNullableEnumPropertyProperty.IsInvalid flag. This property supports change notification. If the MyNullableEnumPropertyProperty.IsInvalid flag changes,
        /// it will cause a change notification event for this property. This property must follow the [MyNullableEnumProperty + "IsInvalid"] convention for change events to work correctly.
        /// </summary>
        public bool MyNullableEnumPropertyIsInvalid
        {
            get { return MyNullableEnumPropertyProperty.IsInvalid; }
        }

        /// <summary>
        /// Gets the MyNullableEnumPropertyProperty.IsDefault flag. This property supports change notification. If the MyNullableEnumPropertyProperty.IsDefault flag changes,
        /// it will cause a change notification event for this property. This property must follow the [MyNullableEnumProperty + "IsDefault"] convention for change events to work correctly.
        /// </summary>
        public bool MyNullableEnumPropertyIsDefault
        {
            get { return MyNullableEnumPropertyProperty.IsDefault; }
        }

        /// <summary>
        /// Gets the MyNullableEnumPropertyProperty.ValidationErrors enumeration. This property supports change notification. If the MyNullableEnumPropertyProperty.ValidationErrors enumeration changes,
        /// it will cause a change notification event for this property. This property must follow the [MyNullableEnumProperty + "ValidationErrors"] convention for change events to work correctly.
        /// </summary>
        public System.Collections.Generic.IEnumerable<ValidationError> MyNullableEnumPropertyValidationErrors
        {
            get { return MyNullableEnumPropertyProperty.ValidationErrors; }
        }

        #endregion

        #region UnconstrainedCollection Property

        [ModelBackingProperty(typeof(List<String>), "UnconstrainedCollectionProperty", ModelBase.StandardBehaviors, false, true)]
        protected readonly ModelProperty<List<String>> _UnconstrainedCollectionProperty = null; //Will be set by reflection.

        /// <summary>
        /// Gets the UnconstrainedCollection backing property
        /// </summary>
        public ModelProperty<List<String>> UnconstrainedCollectionProperty
        {
            get { return _UnconstrainedCollectionProperty; }
        }

        /// <summary>
        /// Gets or sets the UnconstrainedCollectionProperty.Value value. This property supports change notification. If the UnconstrainedCollectionProperty.Value value changes,
        /// it will cause a change notification event for this property. This property must follow the [UnconstrainedCollectionProperty - "Property"] convention for change events to work correctly.
        /// </summary>
        public List<String> UnconstrainedCollection
        {
            get { return UnconstrainedCollectionProperty.Value; }
            set { UnconstrainedCollectionProperty.Value = value; }
        }

        /// <summary>
        /// Gets the UnconstrainedCollectionProperty.CommittedValue value. This property supports change notification. If the UnconstrainedCollectionProperty.CommittedValue value changes,
        /// it will cause a change notification event for this property. This property must follow the [UnconstrainedCollection + "CommittedValue"] convention for change events to work correctly.
        /// </summary>
        public List<String> UnconstrainedCollectionCommittedValue
        {
            get { return UnconstrainedCollectionProperty.CommittedValue; }
        }

        /// <summary>
        /// Gets the UnconstrainedCollectionProperty.IsDirty flag. This property supports change notification. If the UnconstrainedCollectionProperty.IsDirty flag changes,
        /// it will cause a change notification event for this property. This property must follow the [UnconstrainedCollection + "IsDirty"] convention for change events to work correctly.
        /// </summary>
        public bool UnconstrainedCollectionIsDirty
        {
            get { return UnconstrainedCollectionProperty.IsDirty; }
        }

        /// <summary>
        /// Gets the UnconstrainedCollectionProperty.IsInvalid flag. This property supports change notification. If the UnconstrainedCollectionProperty.IsInvalid flag changes,
        /// it will cause a change notification event for this property. This property must follow the [UnconstrainedCollection + "IsInvalid"] convention for change events to work correctly.
        /// </summary>
        public bool UnconstrainedCollectionIsInvalid
        {
            get { return UnconstrainedCollectionProperty.IsInvalid; }
        }

        /// <summary>
        /// Gets the UnconstrainedCollectionProperty.IsDefault flag. This property supports change notification. If the UnconstrainedCollectionProperty.IsDefault flag changes,
        /// it will cause a change notification event for this property. This property must follow the [UnconstrainedCollection + "IsDefault"] convention for change events to work correctly.
        /// </summary>
        public bool UnconstrainedCollectionIsDefault
        {
            get { return UnconstrainedCollectionProperty.IsDefault; }
        }

        /// <summary>
        /// Gets the UnconstrainedCollectionProperty.ValidationErrors enumeration. This property supports change notification. If the UnconstrainedCollectionProperty.ValidationErrors enumeration changes,
        /// it will cause a change notification event for this property. This property must follow the [UnconstrainedCollection + "ValidationErrors"] convention for change events to work correctly.
        /// </summary>
        public System.Collections.Generic.IEnumerable<ValidationError> UnconstrainedCollectionValidationErrors
        {
            get { return UnconstrainedCollectionProperty.ValidationErrors; }
        }

        #endregion
    }
}
